const axios = require('axios');
const { Activity, ActivityParticipant, CheckIn, Badge } = require('./models');

const BASE_URL = 'http://localhost:3000/api';

async function testCheckInFlow() {
  console.log('=== 测试完整的签到->NFT徽章生成流程 ===\n');
  
  try {
    // 1. 注册一个新用户
    console.log('1. 注册新用户...');
    const newUser = {
      username: 'checkin_test_' + Date.now(),
      email: 'checkin_test_' + Date.now() + '@example.com',
      password: 'password123'
    };
    
    const registerResponse = await axios.post(`${BASE_URL}/auth/register`, newUser);
    const userToken = registerResponse.data.token;
    const userId = registerResponse.data.user.id;
    console.log('✅ 用户注册成功, ID:', userId);
    
    // 2. 创建一个正在进行的活动
    console.log('\n2. 创建测试活动...');
    const now = new Date();
    const startTime = new Date(now.getTime() + 1000 * 60 * 5); // 5分钟后开始
    const endTime = new Date(now.getTime() + 1000 * 60 * 60 * 3); // 3小时后结束
    
    const activityData = {
      title: '签到测试活动',
      description: '用于测试签到功能的活动',
      location: '测试地点',
      start_time: startTime.toISOString(),
      end_time: endTime.toISOString(),
      max_participants: 50,
      category_id: 1
    };
    
    const createActivityResponse = await axios.post(`${BASE_URL}/activities`, activityData, {
      headers: { 'Authorization': `Bearer ${userToken}` }
    });
    const activityId = createActivityResponse.data.activity.id;
    console.log('✅ 活动创建成功, ID:', activityId);
    
    // 3. 用户参与活动（在活动开始前）
    console.log('\n3. 用户参与活动...');
    await axios.post(`${BASE_URL}/activities/${activityId}/join`, {}, {
      headers: { 'Authorization': `Bearer ${userToken}` }
    });
    console.log('✅ 用户参与活动成功');
    
    // 3.5. 手动更新活动时间为正在进行状态（绕过验证）
    console.log('\n3.5. 更新活动为进行中状态...');
    await Activity.update({
      start_time: new Date(now.getTime() - 1000 * 60 * 30), // 30分钟前开始
      end_time: new Date(now.getTime() + 1000 * 60 * 60 * 2) // 2小时后结束
    }, {
      where: { id: activityId }
    });
    console.log('✅ 活动时间已更新为进行中状态');
    
    // 4. 验证参与状态
    console.log('\n4. 验证用户参与状态...');
    const participation = await ActivityParticipant.findOne({
      where: { user_id: userId, activity_id: activityId }
    });
    
    if (!participation) {
      throw new Error('用户参与记录不存在');
    }
    console.log('✅ 参与状态:', participation.status);
    
    // 5. 执行签到
    console.log('\n5. 执行活动签到...');
    const checkinData = {
      latitude: 39.9042,  // 北京天安门坐标
      longitude: 116.4074,
      verification_code: 'TEST123'
    };
    
    const checkinResponse = await axios.post(`${BASE_URL}/activities/${activityId}/checkin`, checkinData, {
      headers: { 'Authorization': `Bearer ${userToken}` }
    });
    console.log('✅ 签到成功:', checkinResponse.data.message);
    console.log('   徽章信息:', checkinResponse.data.badgeMessage);
    
    // 6. 验证签到记录
    console.log('\n6. 验证签到记录...');
    const checkin = await CheckIn.findOne({
      where: { user_id: userId, activity_id: activityId }
    });
    
    if (!checkin) {
      throw new Error('签到记录不存在');
    }
    console.log('✅ 签到记录存在, 时间:', checkin.check_in_time);
    
    // 7. 验证参与状态更新
    console.log('\n7. 验证参与状态更新...');
    await participation.reload();
    if (participation.status !== 'attended') {
      throw new Error('参与状态未更新为attended');
    }
    console.log('✅ 参与状态已更新为:', participation.status);
    console.log('   签到时间:', participation.attended_at);
    
    // 8. 等待徽章生成（给异步操作一些时间）
    console.log('\n8. 等待NFT徽章生成...');
    await new Promise(resolve => setTimeout(resolve, 3000));
    
    // 9. 检查徽章是否生成
    console.log('\n9. 检查徽章生成状态...');
    const badge = await Badge.findOne({
      where: { user_id: userId, activity_id: activityId }
    });
    
    if (badge) {
      console.log('✅ NFT徽章生成成功!');
      console.log('   徽章名称:', badge.badge_name);
      console.log('   徽章描述:', badge.badge_description);
      console.log('   稀有度:', badge.rarity);
      console.log('   状态:', badge.status);
      console.log('   铸造时间:', badge.minted_at);
      
      if (badge.token_id) {
        console.log('   Token ID:', badge.token_id);
      }
      if (badge.transaction_hash) {
        console.log('   交易哈希:', badge.transaction_hash);
      }
    } else {
      console.log('⚠️ NFT徽章尚未生成（可能仍在处理中）');
    }
    
    // 10. 测试获取用户徽章API
    console.log('\n10. 测试获取用户徽章API...');
    const userBadgesResponse = await axios.get(`${BASE_URL}/badges?user_id=${userId}`, {
      headers: { 'Authorization': `Bearer ${userToken}` }
    });
    
    console.log('✅ 用户徽章数量:', userBadgesResponse.data.badges.length);
    if (userBadgesResponse.data.badges.length > 0) {
      console.log('   第一个徽章:', userBadgesResponse.data.badges[0].badge_name);
    }
    
    // 11. 测试徽章进度API
    console.log('\n11. 测试徽章进度API...');
    try {
      const progressResponse = await axios.get(`${BASE_URL}/badges/progress`, {
        headers: { 'Authorization': `Bearer ${userToken}` }
      });
      console.log('✅ 徽章进度:', progressResponse.data);
    } catch (error) {
      console.log('⚠️ 徽章进度API调用失败:', error.response?.data?.error || error.message);
    }
    
    console.log('\n🎉 签到->NFT徽章生成流程测试完成！');
    console.log('\n📋 测试总结:');
    console.log('- 用户注册 ✅');
    console.log('- 活动创建 ✅');
    console.log('- 用户参与 ✅');
    console.log('- 活动签到 ✅');
    console.log('- 状态更新 ✅');
    console.log('- NFT徽章生成 ' + (badge ? '✅' : '⚠️'));
    console.log('- API接口测试 ✅');
    
  } catch (error) {
    console.error('\n❌ 测试失败:', error.message);
    if (error.response) {
      console.error('   状态码:', error.response.status);
      console.error('   错误详情:', error.response.data);
    }
  }
}

// 运行测试
testCheckInFlow(); 